/**
 * @file    Plugin.h
 * @brief   
 *          
 *          In Windows they're known as DLLs; in Unix they're shared libraries
 *          
 *
 *
 *
 *
 * PLUGING FRAMEWORK ISSUES:
 *   - singletons, initialization, duplicate symbols => STYLE/LAME
 *   - sub-shared resources allocated or used by DLL (even a simple 'new Message') => CRASH on unloading
 *   - better architexture, factory and base classes
 *
 *
 *
 *

 ****************************************************************************
 * @version $Id: Plugin.h 2057 2010-03-08 21:32:15Z alex $
 * @author  Alessandro Polo
 ****************************************************************************/
/* Copyright (c) 2007-2010, WOSH - Wide Open Smart Home 
 * by Alessandro Polo - OpenSmartHome.com
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the OpenSmartHome.com WOSH nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY Alessandro Polo ''AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL Alessandro Polo BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 ****************************************************************************/

/*
g++ -fPIC -shared Plugin.cpp -o myclass.so
g++ main.cpp -ldl -o sample
*/

#ifndef __WOSH_Plugins_Plugin_H__
 #define __WOSH_Plugins_Plugin_H__

 #include <woshDefs.h>
 #include <core/Reflection.h>

 #include <string>

 
namespace wosh {
 class WoshKernel;

 namespace plugins {


#ifdef _OS_POSIX
 #define WOSH_EXPORT_API extern "C"
#else
 #define WOSH_EXPORT_API extern "C" __declspec(dllexport)
#endif

#ifdef _OS_POSIX
 #define WOSH_IMPORT_API extern "C"
#else
 #define WOSH_IMPORT_API extern "C" __declspec(dllimport)
#endif



//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// allows PluginModule to gather information about the library

struct PluginInformation {

	char library_uuid[255];

	char library_name[255];
	char library_author[255];

	double version_mayor;
	double version_minor;

	char** objects_type;
	int objects_type_count;
};


#define _PLUGIN_FUNC_GATHER_INFO		"gather_library_information"

typedef void (*gather_library_information_t)(PluginInformation*);

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define _PLUGIN_FUNC_INIT				"init_allocator"

typedef void (*init_allocator_t)( wosh::WoshKernel* global_kernel );

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define _PLUGIN_FUNC_DEINIT				"deinit_allocator"

typedef void (*deinit_allocator_t)( wosh::WoshKernel* global_kernel );

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define _PLUGIN_FUNC_CREATE				"create_object"

typedef IReflection* (*create_object_t)( const char* object_type );

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define _PLUGIN_FUNC_DESTROY			"destroy_object"

typedef void (*destroy_object_t)(IReflection*);

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////


 }; // namespace plugins
}; // namespace wosh

#endif //__WOSH_Plugins_Plugin_H__
